package com.budingge.common.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
import org.apache.commons.compress.compressors.CompressorInputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import org.apache.commons.io.IOUtils;

/**
 * 
 * @ClassName: GzipArchiveUtils
 * @Description: 压缩解压工具
 * @author budingge.com
 * @date 2014年5月1日 下午11:17:53
 * 
 */
public class GzipArchiveUtils {
	/**
	 * 解压tar.gz文件 tar文件只是把多个文件或文件夹打包合成一个文件，本身并没有进行压缩。gz是进行过压缩的文件。
	 * 
	 * @param dir
	 * @param filepath
	 * @throws Exception
	 */
	public static void deGzipArchive(String dir, String filepath)
			throws Exception {
		deGzipg(dir,null,filepath);
	}

	/**
	 * 在tar.gz文件中查找文件并导出
	 * 
	 * @param dir
	 *            存放查找文件路径
	 * @param filename
	 *            查找文件名
	 * @param filepath
	 *            tar.gz路径
	 * @throws IOException
	 */
	public static void deGzipg(String dir, String filename, String filepath)
			throws IOException {

		// 包装过程
		final File input = new File(filepath);
		final InputStream is = new FileInputStream(input);
		final CompressorInputStream in = new GzipCompressorInputStream(is, true);
		TarArchiveInputStream tin = new TarArchiveInputStream(in);

		TarArchiveEntry entry = tin.getNextTarEntry();// 获取压缩文件的实体
		while (entry != null) {
			File archiveEntry = new File(dir, entry.getName());
			archiveEntry.getParentFile().mkdirs();
			if (entry.isDirectory()) {
				archiveEntry.mkdir();
				entry = tin.getNextTarEntry();
				continue;
			}
			String tmp = archiveEntry.getName();// 文件名
			if(filename!=null){
				if (tmp.equalsIgnoreCase(filename)) {// 文件名比对
					File des = new File(dir, filename);// 创建存储文件
					des.getParentFile().mkdirs();// 创建存储文件的父目录
					OutputStream out = new FileOutputStream(des);
					IOUtils.copy(tin, out);// 写入文件
					out.close();
					break;
				}
			}else{
				File des = new File(dir, tmp);// 创建存储文件
				des.getParentFile().mkdirs();// 创建存储文件的父目录
				OutputStream out = new FileOutputStream(des);
				IOUtils.copy(tin, out);// 写入文件
				out.close();
			}
			entry = tin.getNextTarEntry();// 下一个实体
		}
		in.close();
		tin.close();
	}
}
